package 反射;
/*
使用反射机制步骤如下
1. 导入java.lang.relfect 包
2. 获得你想操作的类的 java.lang.Class 对象
3. 调用诸如 getDeclaredMethods 的方法
4. 使用反射API 来操作这些信息

获取class对象的3种方法
1. 已经得到一个类的实例，可以使用如下方式来得到Class对象.
Class c = 对象名.getClass();
2. 如果在编译期知道类的名字，可以使用如下方法.
Class c = java.awt.Button.class; 
或
Class c = Integer.TYPE;
3. 如果类名在编译期不知道, 但是在运行期可以获得, 可以使用下面的方法
Class c = Class.forName(str);  //注意:str是类的全路径

例子
 */
//package com.reflection.classForName;
public class 反射机制的步骤 {
    public static void main(String[] args) throws InstantiationException,IllegalAccessException,NoSuchFieldException,SecurityException {
        System.out.println("测试开始");
        GetClassTestObj gctObj = new GetClassTestObj();
        Class < ? extends GetClassTestObj > clazzClass = gctObj.getClass(); //同过反射机制得到类的对象
        System.out.println("clazzClass:" + clazzClass);
        GetClassTestObj gctObj2 = (GetClassTestObj) clazzClass.newInstance(); //调用无参构造方法，创建一个对象
        System.out.println("gctObj==gctOb2 :" + (gctObj == gctObj2));
        System.out.println("gctObj.getClass() == gctOb2.getClass() :" + (gctObj.getClass() == gctObj2.getClass()));
        gctObj2.print();
        //    Field[] field=clazzClass.getDeclaredFields();
        //    for(Field me : field){
        //       System.out.println("shu:"+me);
        //    }
    }
}

class GetClassTestObj {
    static { //静态代码块，只执行一次
        System.out.println("nihao");
    }
    private String name = "chen";
    public String address = "chengdu";
    public void print() {
        System.out.println("name:" + name + " ,address:" + address);
    }
}
//这样获得Class类对象的方法，其实是利用反射API把指定字符串的类加载到内存中，所以也叫类加载器加载方法。这样的话，它会把该类的静态方法和静态属性，
//以及静态代码全部加载到内存中。但这时候，对象还没有产生。所以为什么静态方法不能访问非静态属性和方法。因为静态方法和属性产生的时机在非静态属性和方法之前。


